/******************************************************************************
* 文件名称: event.c
* 内容摘要: 事件
* 创建者の: 孔佳伟
* 个人主页: https://gitee.com/thin-wind/jump
* 修改记录: 
******************************************************************************/

#include <event.h>
#include <memory.h>
#include <schedule.h>
#include <task.h>

static LIST EVENT_LIST;         // 等待时间链表

/******************************************************************************
* 函数名称: void EventInit(void)
* 功能说明: 初始化等待事件
* 输入参数: 无
* 输出参数: 无
* 函数返回: 无
* 其它说明: 
******************************************************************************/
void EventInit(void)
{
    ListInit(&EVENT_LIST);
}

/******************************************************************************
* 函数名称: EVENT* SYS_EventCreat(void)
* 功能说明: 创建等待事件
* 输入参数: 无
* 输出参数: 无
* 函数返回: EVENT*          --事件
* 其它说明: 
******************************************************************************/
EVENT* SYS_EventCreat(void)
{
    EVENT* event = (EVENT *)Malloc(sizeof(EVENT));
    
    if(NULL == event)
        return NULL;

    event->event = 0;                             // 等待事件未生产状态
    ListAddHead(&EVENT_LIST, (LIST_NODE *)event); // 头插
    QueueInit(&event->wait);                      // 初始化等待事件中的等待队列

    return event;
}

/******************************************************************************
* 函数名称: static BOOL CheckEvent(EVENT* event)
* 功能说明: 检查等待事件是否合法有效
* 输入参数: EVENT*   event        --事件
* 输出参数: 无
* 函数返回: 0:无效; 1:有效
* 其它说明: 无
******************************************************************************/
static BOOL CheckEvent(EVENT* event)
{
    LIST_NODE* pListNode = NULL;
    EVENT* nodeTmp = NULL;

    LIST_FOR_EACH(&EVENT_LIST, pListNode)
    {
        nodeTmp = (EVENT *)LIST_NODE(pListNode, EVENT, node);
        if(event == nodeTmp)
            return 1;
    }
    return 0;
} 

/******************************************************************************
* 函数名称: E_RET SYS_WaitEvent(EVENT* event)
* 功能说明: 事件
* 输入参数: EVENT* event    --事件
* 输出参数: 无
* 函数返回: E_OK:成功; E_ERR:失败
* 其它说明: 无
******************************************************************************/
E_RET SYS_WaitEvent(EVENT* event)
{
    // 检查参数合法性
    if(NULL == event || !CheckEvent(event))
        return E_ERR;

    // 将当前任务节点从任务就绪队列中转移到等待时间的等待队列中
    if(0 == event->event)
        EventSuspend(event);
        
    return E_OK;
}

/******************************************************************************
* 函数名称: E_RET SYS_SetEvent(EVENT* event)
* 功能说明: 设置等待事件
* 输入参数: EVENT* event    --事件
* 输出参数: 无
* 函数返回: E_OK:成功; E_ERR:失败
* 其它说明: 无
******************************************************************************/
E_RET SYS_SetEvent(EVENT* event)
{
    // 检查参数合法性
    if(NULL == event || !CheckEvent(event))
        return E_ERR;
    
    // 将等待事件的状态设置为 1，表明事件发生
    event->event = 1;

    // 将等待事件 event 中的等待队列中的任务转移到任务就绪队列中
    EventResume(event);
        
    return E_OK;
}

/******************************************************************************
* 函数名称: E_RET SYS_ClearEvent(EVENT* event)
* 功能说明: 清除等待事件
* 输入参数: EVENT* event    --事件
* 输出参数: 无
* 函数返回: E_OK:成功; E_ERR:失败
* 其它说明: 无
******************************************************************************/
E_RET SYS_ClearEvent(EVENT* event)
{
    // 检查参数合法性
    if(NULL == event || !CheckEvent(event))
        return E_ERR;
    
    // 将等待事件的状态设置为 0，表明事件已被处理
    event->event = 0;
        
    return E_OK;
}

/******************************************************************************
* 函数名称: E_RET SYS_EventDestory(EVENT* event)
* 功能说明: 销毁等待事件
* 输入参数: EVENT* event    --事件
* 输出参数: 无
* 函数返回: E_OK:成功; E_ERR:失败
* 其它说明: 无
******************************************************************************/
E_RET SYS_EventDestory(EVENT* event)
{
    // 检查参数合法性
    if(NULL == event || !CheckEvent(event))
        return E_ERR;

    // 删除链表节点并释放内存
    ListDelNode(&event->node);
    Free(event);
    
    return E_OK;
}
